package main

import (
	"bytes"
	"encoding/gob"
	"fmt"
	"unsafe"
)

/*
  原型模式就是讲一个对象作为原型，使用Clone()方法来创建新的实例。
  Clone():最简单的方式是基于序列化和反序列化来实现对象的深度复制
*/

type Prototype struct {
	Name string
}

func (p Prototype) Clone() Prototype {
	var buf bytes.Buffer
	gob.NewEncoder(&buf).Encode(&p)
	var pro Prototype
	gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(&pro)
	return pro
}

func main() {
	pro1 := Prototype{Name:"原型"}
	pro2 := pro1.Clone()
	fmt.Println(pro1)
	fmt.Println(unsafe.Pointer(&pro1))
	fmt.Println(pro2)
	fmt.Println(unsafe.Pointer(&pro2))
}